package com.xtwy.common.core.service;

import com.xtwy.utils.SnowFlakeUtil;
import org.apache.ibatis.session.RowBounds;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import tk.mybatis.mapper.common.Mapper;

import java.util.List;

/**
 * @描述：
 *  服务接口基类
 *
 * @公司：  山西迅腾伟业
 * @版本：  1.0.0
 * @日期：  18/08/02
 * @作者：  侯建军
 */
public abstract class BaseService<T> implements IService<T>{
    protected final Logger logger = LoggerFactory.getLogger(this.getClass());
    /**
     * 注入通用mapper
     */
    @Autowired
    protected Mapper<T> mapper;
    /**
     *
     * @Title: getMapper
     * @Description: 获取Mapper
     * @author 侯建军
     * @date 2018年7月27日 下午1:22:34
     * @version V1.0
     * @param @return    参数
     * @return Mapper<T>    返回类型
     */
    public Mapper<T> getMapper() {
        return mapper;
    }
    /**
     * 根据实体类不为null的字段进行查询,条件全部使用=号and条件
     */
    @Override
    public List<T> select(T record) {
        return mapper.select(record);
    }
    /**
     * 根据主键进行查询,必须保证结果唯一
     */
    @Override
    public T selectByKey(Object key) {
        return mapper.selectByPrimaryKey(key);
    }
    /**
     * 查询所有
     */
    @Override
    public List<T> selectAll() {
        return mapper.selectAll();
    }
    /**
     * 查询一条
     */
    @Override
    public T selectOne(T record) {
        return mapper.selectOne(record);
    }
    /**
     * 查询记录数
     */
    @Override
    public int selectCount(T record) {
        return mapper.selectCount(record);
    }

    /**
     * 根据Example条件进行查询
     */
    @Override
    public List<T> selectByExample(Object example) {
        return mapper.selectByExample(example);
    }
    /**
     * 保存一个实体，null的属性不会保存，会使用数据库默认值
     */
    @Override
    public int save(T record) {
        return mapper.insertSelective(record);
    }
    /**
     * 批量添加
     */
    @Override
    public int batchSave(List<T> list) {
        int result = 0;
        for (T record : list) {
            int count = mapper.insertSelective(record);
            result += count;
        }
        return result;
    }
    /**
     * 记录修改
     */
    @Override
    public int modify(T entity) {
        return mapper.updateByPrimaryKeySelective(entity);
    }
    /**
     * 根据实体属性作为条件进行删除，查询条件使用等号
     */
    @Override
    public int remove(T record) {
        return mapper.delete(record);
    }
    /**
     *
     * @Title: deleteByKey
     * @Description: 按主键删除
     * @author 侯建军
     * @date 2018年7月27日 下午1:30:10
     * @version V1.0
     * @param @param key
     * @param @return    参数
     * @return int    返回类型
     */
    @Override
    public int removeByKey(Object key) {
        return mapper.deleteByPrimaryKey(key);
    }
    /**
     * 批量删除
     */
    @Override
    public int batchRemove(List<T> list) {
        int result = 0;
        for (T record : list) {
            int count = mapper.delete(record);
            if (count < 1) {
                logger.error("删除数据失败");
                //throw new BusinessException("删除数据失败!");
            }
            result += count;
        }
        return result;
    }
    /**
     * 按example查询记录数
     */
    @Override
    public int selectCountByExample(Object example) {
        return mapper.selectCountByExample(example);
    }
    /**
     * 按example条件修改记录
     */
    @Override
    public int modfiyByExample(T record, Object example) {
        return mapper.updateByExampleSelective(record, example);
    }
    /**
     * 按example条件删除
     */
    @Override
    public int removeByExample(Object example) {
        return mapper.deleteByPrimaryKey(example);
    }
    /**
     * 默认为内存分页
     */
    @Override
    public List<T> selectByRowBounds(T record, RowBounds rowBounds) {
        return mapper.selectByRowBounds(record, rowBounds);
    }
    /**
     * 按example条件进行分页查询
     */
    @Override
    public List<T> selectByExampleAndRowBounds(Object example, RowBounds rowBounds) {
        return mapper.selectByExampleAndRowBounds(example, rowBounds);
    }

    protected long generateId() {
        return SnowFlakeUtil.getInstance().nextId();
    }
}



//~ Formatted by Jindent --- http://www.jindent.com
